/*题目：
 * 小明喜欢品尝不同口味的咖啡，他发现每种咖啡都可以加入不同的调料，比如牛奶、糖和巧克力。
 他决定使用装饰者模式制作自己喜欢的咖啡。请设计一个简单的咖啡制作系统，使用装饰者模式为咖啡添加不同的调料。
 系统支持两种咖啡类型：黑咖啡（Black Coffee）和拿铁（Latte）。
 * 输入：多行输入，每行包含两个数字。第一个数字表示咖啡的选择（1 表示黑咖啡，2 表示拿铁），
         第二个数字表示要添加的调料类型（1 表示牛奶，2 表示糖）。
 * 输出：根据每行输入，输出制作咖啡的过程，包括咖啡类型和添加的调料。
 * 示例：
 *      输入：1 1
             2 2
        输出：Brewing Black Coffee
            Adding Milk
            Brewing Latte
            Adding Sugar
 * */

#include <iostream>
#include <memory>
// 咖啡接口
class Coffee {
public:
    virtual ~Coffee() {}
    virtual void brew() = 0;
};

// 具体的黑咖啡类
class BlackCoffee : public Coffee {
public:
    void brew() override {
        std::cout << "Brewing Black Coffee" << std::endl;
    }
};

// 具体的拿铁类
class Latte : public Coffee {
public:
    void brew() override {
        std::cout << "Brewing Latte" << std::endl;
    }
};

// 装饰者抽象类
class Decorator : public Coffee {
protected:
    std::unique_ptr<Coffee> coffee;
public:
    Decorator(std::unique_ptr<Coffee> coffee) : coffee(std::move(coffee)) {}
    void brew() override {
        if (coffee) {
            coffee->brew();
        }
    }
};

// 具体的牛奶装饰者类
class MilkDecorator : public Decorator {
public:
    MilkDecorator(std::unique_ptr<Coffee> coffee) : Decorator(std::move(coffee))
    {}
    void brew() override {
        Decorator::brew();
        std::cout << "Adding Milk" << std::endl;
    }
};

// 具体的糖装饰者类
class SugarDecorator : public Decorator {
public:
    SugarDecorator(std::unique_ptr<Coffee> coffee) : Decorator(std::move(coffee))
    {}
    void brew() override {
        Decorator::brew();
        std::cout << "Adding Sugar" << std::endl;
    }
};

// 客户端代码
int main() {
    int coffeeType, condimentType;
    while (std::cin >> coffeeType >> condimentType) {
    // 根据输入制作咖啡
        std::unique_ptr<Coffee> coffee;
        if (coffeeType == 1) {
            coffee = std::make_unique<BlackCoffee>();
        } else if (coffeeType == 2) {
            coffee = std::make_unique<Latte>();
        } else {
            std::cout << "Invalid coffee type" << std::endl;
            continue;
        }
    // 根据输入添加调料
        if (condimentType == 1) {
            coffee = std::make_unique<MilkDecorator>(std::move(coffee));
        } else if (condimentType == 2) {
            coffee = std::make_unique<SugarDecorator>(std::move(coffee));
        } else {
            std::cout << "Invalid condiment type" << std::endl;
            continue;
        }
    // 输出制作过程
        coffee->brew();
    }
    return 0;
}